home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / include / nss / cms.h < prev    next >
C/C++ Source or Header  |  2006-04-20  |  38KB  |  1,142 lines

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
  3.  *
  4.  * The contents of this file are subject to the Mozilla Public License Version
  5.  * 1.1 (the "License"); you may not use this file except in compliance with
  6.  * the License. You may obtain a copy of the License at
  7.  * http://www.mozilla.org/MPL/
  8.  *
  9.  * Software distributed under the License is distributed on an "AS IS" basis,
  10.  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  11.  * for the specific language governing rights and limitations under the
  12.  * License.
  13.  *
  14.  * The Original Code is the Netscape security libraries.
  15.  *
  16.  * The Initial Developer of the Original Code is
  17.  * Netscape Communications Corporation.
  18.  * Portions created by the Initial Developer are Copyright (C) 1994-2000
  19.  * the Initial Developer. All Rights Reserved.
  20.  *
  21.  * Contributor(s):
  22.  *
  23.  * Alternatively, the contents of this file may be used under the terms of
  24.  * either the GNU General Public License Version 2 or later (the "GPL"), or
  25.  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  26.  * in which case the provisions of the GPL or the LGPL are applicable instead
  27.  * of those above. If you wish to allow use of your version of this file only
  28.  * under the terms of either the GPL or the LGPL, and not to allow others to
  29.  * use your version of this file under the terms of the MPL, indicate your
  30.  * decision by deleting the provisions above and replace them with the notice
  31.  * and other provisions required by the GPL or the LGPL. If you do not delete
  32.  * the provisions above, a recipient may use your version of this file under
  33.  * the terms of any one of the MPL, the GPL or the LGPL.
  34.  *
  35.  * ***** END LICENSE BLOCK ***** */
  36.  
  37. /*
  38.  * Interfaces of the CMS implementation.
  39.  *
  40.  * $Id: cms.h,v 1.20 2004/04/25 15:03:15 gerv%gerv.net Exp $
  41.  */
  42.  
  43. #ifndef _CMS_H_
  44. #define _CMS_H_
  45.  
  46. #include "seccomon.h"
  47.  
  48. #include "secoidt.h"
  49. #include "certt.h"
  50. #include "keyt.h"
  51. #include "hasht.h"
  52. #include "cmst.h"
  53.  
  54. /************************************************************************/
  55. SEC_BEGIN_PROTOS
  56.  
  57. /************************************************************************
  58.  * cmsdecode.c - CMS decoding
  59.  ************************************************************************/
  60.  
  61. /*
  62.  * NSS_CMSDecoder_Start - set up decoding of a DER-encoded CMS message
  63.  *
  64.  * "poolp" - pointer to arena for message, or NULL if new pool should be created
  65.  * "cb", "cb_arg" - callback function and argument for delivery of inner content
  66.  *                  inner content will be stored in the message if cb is NULL.
  67.  * "pwfn", pwfn_arg" - callback function for getting token password
  68.  * "decrypt_key_cb", "decrypt_key_cb_arg" - callback function for getting bulk key for encryptedData
  69.  */
  70. extern NSSCMSDecoderContext *
  71. NSS_CMSDecoder_Start(PRArenaPool *poolp,
  72.               NSSCMSContentCallback cb, void *cb_arg,
  73.               PK11PasswordFunc pwfn, void *pwfn_arg,
  74.               NSSCMSGetDecryptKeyCallback decrypt_key_cb, void *decrypt_key_cb_arg);
  75.  
  76. /*
  77.  * NSS_CMSDecoder_Update - feed DER-encoded data to decoder
  78.  */
  79. extern SECStatus
  80. NSS_CMSDecoder_Update(NSSCMSDecoderContext *p7dcx, const char *buf, unsigned long len);
  81.  
  82. /*
  83.  * NSS_CMSDecoder_Cancel - cancel a decoding process
  84.  */
  85. extern void
  86. NSS_CMSDecoder_Cancel(NSSCMSDecoderContext *p7dcx);
  87.  
  88. /*
  89.  * NSS_CMSDecoder_Finish - mark the end of inner content and finish decoding
  90.  */
  91. extern NSSCMSMessage *
  92. NSS_CMSDecoder_Finish(NSSCMSDecoderContext *p7dcx);
  93.  
  94. /*
  95.  * NSS_CMSMessage_CreateFromDER - decode a CMS message from DER encoded data
  96.  */
  97. extern NSSCMSMessage *
  98. NSS_CMSMessage_CreateFromDER(SECItem *DERmessage,
  99.             NSSCMSContentCallback cb, void *cb_arg,
  100.             PK11PasswordFunc pwfn, void *pwfn_arg,
  101.             NSSCMSGetDecryptKeyCallback decrypt_key_cb, void *decrypt_key_cb_arg);
  102.  
  103. /************************************************************************
  104.  * cmsencode.c - CMS encoding
  105.  ************************************************************************/
  106.  
  107. /*
  108.  * NSS_CMSEncoder_Start - set up encoding of a CMS message
  109.  *
  110.  * "cmsg" - message to encode
  111.  * "outputfn", "outputarg" - callback function for delivery of DER-encoded output
  112.  *                           will not be called if NULL.
  113.  * "dest" - if non-NULL, pointer to SECItem that will hold the DER-encoded output
  114.  * "destpoolp" - pool to allocate DER-encoded output in
  115.  * "pwfn", pwfn_arg" - callback function for getting token password
  116.  * "decrypt_key_cb", "decrypt_key_cb_arg" - callback function for getting bulk key for encryptedData
  117.  * "detached_digestalgs", "detached_digests" - digests from detached content
  118.  */
  119. extern NSSCMSEncoderContext *
  120. NSS_CMSEncoder_Start(NSSCMSMessage *cmsg,
  121.             NSSCMSContentCallback outputfn, void *outputarg,
  122.             SECItem *dest, PLArenaPool *destpoolp,
  123.             PK11PasswordFunc pwfn, void *pwfn_arg,
  124.             NSSCMSGetDecryptKeyCallback decrypt_key_cb, void *decrypt_key_cb_arg,
  125.             SECAlgorithmID **detached_digestalgs, SECItem **detached_digests);
  126.  
  127. /*
  128.  * NSS_CMSEncoder_Update - take content data delivery from the user
  129.  *
  130.  * "p7ecx" - encoder context
  131.  * "data" - content data
  132.  * "len" - length of content data
  133.  */
  134. extern SECStatus
  135. NSS_CMSEncoder_Update(NSSCMSEncoderContext *p7ecx, const char *data, unsigned long len);
  136.  
  137. /*
  138.  * NSS_CMSEncoder_Cancel - stop all encoding
  139.  */
  140. extern SECStatus
  141. NSS_CMSEncoder_Cancel(NSSCMSEncoderContext *p7ecx);
  142.  
  143. /*
  144.  * NSS_CMSEncoder_Finish - signal the end of data
  145.  *
  146.  * we need to walk down the chain of encoders and the finish them from the innermost out
  147.  */
  148. extern SECStatus
  149. NSS_CMSEncoder_Finish(NSSCMSEncoderContext *p7ecx);
  150.  
  151. /************************************************************************
  152.  * cmsmessage.c - CMS message object
  153.  ************************************************************************/
  154.  
  155. /*
  156.  * NSS_CMSMessage_Create - create a CMS message object
  157.  *
  158.  * "poolp" - arena to allocate memory from, or NULL if new arena should be created
  159.  */
  160. extern NSSCMSMessage *
  161. NSS_CMSMessage_Create(PLArenaPool *poolp);
  162.  
  163. /*
  164.  * NSS_CMSMessage_SetEncodingParams - set up a CMS message object for encoding or decoding
  165.  *
  166.  * "cmsg" - message object
  167.  * "pwfn", pwfn_arg" - callback function for getting token password
  168.  * "decrypt_key_cb", "decrypt_key_cb_arg" - callback function for getting bulk key for encryptedData
  169.  * "detached_digestalgs", "detached_digests" - digests from detached content
  170.  *
  171.  * used internally.
  172.  */
  173. extern void
  174. NSS_CMSMessage_SetEncodingParams(NSSCMSMessage *cmsg,
  175.             PK11PasswordFunc pwfn, void *pwfn_arg,
  176.             NSSCMSGetDecryptKeyCallback decrypt_key_cb, void *decrypt_key_cb_arg,
  177.             SECAlgorithmID **detached_digestalgs, SECItem **detached_digests);
  178.  
  179. /*
  180.  * NSS_CMSMessage_Destroy - destroy a CMS message and all of its sub-pieces.
  181.  */
  182. extern void
  183. NSS_CMSMessage_Destroy(NSSCMSMessage *cmsg);
  184.  
  185. /*
  186.  * NSS_CMSMessage_Copy - return a copy of the given message. 
  187.  *
  188.  * The copy may be virtual or may be real -- either way, the result needs
  189.  * to be passed to NSS_CMSMessage_Destroy later (as does the original).
  190.  */
  191. extern NSSCMSMessage *
  192. NSS_CMSMessage_Copy(NSSCMSMessage *cmsg);
  193.  
  194. /*
  195.  * NSS_CMSMessage_GetArena - return a pointer to the message's arena pool
  196.  */
  197. extern PLArenaPool *
  198. NSS_CMSMessage_GetArena(NSSCMSMessage *cmsg);
  199.  
  200. /*
  201.  * NSS_CMSMessage_GetContentInfo - return a pointer to the top level contentInfo
  202.  */
  203. extern NSSCMSContentInfo *
  204. NSS_CMSMessage_GetContentInfo(NSSCMSMessage *cmsg);
  205.  
  206. /*
  207.  * Return a pointer to the actual content. 
  208.  * In the case of those types which are encrypted, this returns the *plain* content.
  209.  * In case of nested contentInfos, this descends and retrieves the innermost content.
  210.  */
  211. extern SECItem *
  212. NSS_CMSMessage_GetContent(NSSCMSMessage *cmsg);
  213.  
  214. /*
  215.  * NSS_CMSMessage_ContentLevelCount - count number of levels of CMS content objects in this message
  216.  *
  217.  * CMS data content objects do not count.
  218.  */
  219. extern int
  220. NSS_CMSMessage_ContentLevelCount(NSSCMSMessage *cmsg);
  221.  
  222. /*
  223.  * NSS_CMSMessage_ContentLevel - find content level #n
  224.  *
  225.  * CMS data content objects do not count.
  226.  */
  227. extern NSSCMSContentInfo *
  228. NSS_CMSMessage_ContentLevel(NSSCMSMessage *cmsg, int n);
  229.  
  230. /*
  231.  * NSS_CMSMessage_ContainsCertsOrCrls - see if message contains certs along the way
  232.  */
  233. extern PRBool
  234. NSS_CMSMessage_ContainsCertsOrCrls(NSSCMSMessage *cmsg);
  235.  
  236. /*
  237.  * NSS_CMSMessage_IsEncrypted - see if message contains a encrypted submessage
  238.  */
  239. extern PRBool
  240. NSS_CMSMessage_IsEncrypted(NSSCMSMessage *cmsg);
  241.  
  242. /*
  243.  * NSS_CMSMessage_IsSigned - see if message contains a signed submessage
  244.  *
  245.  * If the CMS message has a SignedData with a signature (not just a SignedData)
  246.  * return true; false otherwise.  This can/should be called before calling
  247.  * VerifySignature, which will always indicate failure if no signature is
  248.  * present, but that does not mean there even was a signature!
  249.  * Note that the content itself can be empty (detached content was sent
  250.  * another way); it is the presence of the signature that matters.
  251.  */
  252. extern PRBool
  253. NSS_CMSMessage_IsSigned(NSSCMSMessage *cmsg);
  254.  
  255. /*
  256.  * NSS_CMSMessage_IsContentEmpty - see if content is empty
  257.  *
  258.  * returns PR_TRUE is innermost content length is < minLen
  259.  * XXX need the encrypted content length (why?)
  260.  */
  261. extern PRBool
  262. NSS_CMSMessage_IsContentEmpty(NSSCMSMessage *cmsg, unsigned int minLen);
  263.  
  264. /************************************************************************
  265.  * cmscinfo.c - CMS contentInfo methods
  266.  ************************************************************************/
  267.  
  268. /*
  269.  * NSS_CMSContentInfo_Destroy - destroy a CMS contentInfo and all of its sub-pieces.
  270.  */
  271. extern void
  272. NSS_CMSContentInfo_Destroy(NSSCMSContentInfo *cinfo);
  273.  
  274. /*
  275.  * NSS_CMSContentInfo_GetChildContentInfo - get content's contentInfo (if it exists)
  276.  */
  277. extern NSSCMSContentInfo *
  278. NSS_CMSContentInfo_GetChildContentInfo(NSSCMSContentInfo *cinfo);
  279.  
  280. /*
  281.  * NSS_CMSContentInfo_SetContent - set cinfo's content type & content to CMS object
  282.  */
  283. extern SECStatus
  284. NSS_CMSContentInfo_SetContent(NSSCMSMessage *cmsg, NSSCMSContentInfo *cinfo, SECOidTag type, void *ptr);
  285.  
  286. /*
  287.  * NSS_CMSContentInfo_SetContent_XXXX - typesafe wrappers for NSS_CMSContentInfo_SetType
  288.  *   set cinfo's content type & content to CMS object
  289.  */
  290. extern SECStatus
  291. NSS_CMSContentInfo_SetContent_Data(NSSCMSMessage *cmsg, NSSCMSContentInfo *cinfo, SECItem *data, PRBool detached);
  292.  
  293. extern SECStatus
  294. NSS_CMSContentInfo_SetContent_SignedData(NSSCMSMessage *cmsg, NSSCMSContentInfo *cinfo, NSSCMSSignedData *sigd);
  295.  
  296. extern SECStatus
  297. NSS_CMSContentInfo_SetContent_EnvelopedData(NSSCMSMessage *cmsg, NSSCMSContentInfo *cinfo, NSSCMSEnvelopedData *envd);
  298.  
  299. extern SECStatus
  300. NSS_CMSContentInfo_SetContent_DigestedData(NSSCMSMessage *cmsg, NSSCMSContentInfo *cinfo, NSSCMSDigestedData *digd);
  301.  
  302. extern SECStatus
  303. NSS_CMSContentInfo_SetContent_EncryptedData(NSSCMSMessage *cmsg, NSSCMSContentInfo *cinfo, NSSCMSEncryptedData *encd);
  304.  
  305. /*
  306.  * NSS_CMSContentInfo_GetContent - get pointer to inner content
  307.  *
  308.  * needs to be casted...
  309.  */
  310. extern void *
  311. NSS_CMSContentInfo_GetContent(NSSCMSContentInfo *cinfo);
  312.  
  313. /* 
  314.  * NSS_CMSContentInfo_GetInnerContent - get pointer to innermost content
  315.  *
  316.  * this is typically only called by NSS_CMSMessage_GetContent()
  317.  */
  318. extern SECItem *
  319. NSS_CMSContentInfo_GetInnerContent(NSSCMSContentInfo *cinfo);
  320.  
  321. /*
  322.  * NSS_CMSContentInfo_GetContentType{Tag,OID} - find out (saving pointer to lookup result
  323.  * for future reference) and return the inner content type.
  324.  */
  325. extern SECOidTag
  326. NSS_CMSContentInfo_GetContentTypeTag(NSSCMSContentInfo *cinfo);
  327.  
  328. extern SECItem *
  329. NSS_CMSContentInfo_GetContentTypeOID(NSSCMSContentInfo *cinfo);
  330.  
  331. /*
  332.  * NSS_CMSContentInfo_GetContentEncAlgTag - find out (saving pointer to lookup result
  333.  * for future reference) and return the content encryption algorithm tag.
  334.  */
  335. extern SECOidTag
  336. NSS_CMSContentInfo_GetContentEncAlgTag(NSSCMSContentInfo *cinfo);
  337.  
  338. /*
  339.  * NSS_CMSContentInfo_GetContentEncAlg - find out and return the content encryption algorithm tag.
  340.  */
  341. extern SECAlgorithmID *
  342. NSS_CMSContentInfo_GetContentEncAlg(NSSCMSContentInfo *cinfo);
  343.  
  344. extern SECStatus
  345. NSS_CMSContentInfo_SetContentEncAlg(PLArenaPool *poolp, NSSCMSContentInfo *cinfo,
  346.                     SECOidTag bulkalgtag, SECItem *parameters, int keysize);
  347.  
  348. extern SECStatus
  349. NSS_CMSContentInfo_SetContentEncAlgID(PLArenaPool *poolp, NSSCMSContentInfo *cinfo,
  350.                     SECAlgorithmID *algid, int keysize);
  351.  
  352. extern void
  353. NSS_CMSContentInfo_SetBulkKey(NSSCMSContentInfo *cinfo, PK11SymKey *bulkkey);
  354.  
  355. extern PK11SymKey *
  356. NSS_CMSContentInfo_GetBulkKey(NSSCMSContentInfo *cinfo);
  357.  
  358. extern int
  359. NSS_CMSContentInfo_GetBulkKeySize(NSSCMSContentInfo *cinfo);
  360.  
  361. /************************************************************************
  362.  * cmsutil.c - CMS misc utility functions
  363.  ************************************************************************/
  364.  
  365. /*
  366.  * NSS_CMSArray_SortByDER - sort array of objects by objects' DER encoding
  367.  *
  368.  * make sure that the order of the objects guarantees valid DER (which must be
  369.  * in lexigraphically ascending order for a SET OF); if reordering is necessary it
  370.  * will be done in place (in objs).
  371.  */
  372. extern SECStatus
  373. NSS_CMSArray_SortByDER(void **objs, const SEC_ASN1Template *objtemplate, void **objs2);
  374.  
  375. /*
  376.  * NSS_CMSUtil_DERCompare - for use with NSS_CMSArray_Sort to
  377.  *  sort arrays of SECItems containing DER
  378.  */
  379. extern int
  380. NSS_CMSUtil_DERCompare(void *a, void *b);
  381.  
  382. /*
  383.  * NSS_CMSAlgArray_GetIndexByAlgID - find a specific algorithm in an array of 
  384.  * algorithms.
  385.  *
  386.  * algorithmArray - array of algorithm IDs
  387.  * algid - algorithmid of algorithm to pick
  388.  *
  389.  * Returns:
  390.  *  An integer containing the index of the algorithm in the array or -1 if 
  391.  *  algorithm was not found.
  392.  */
  393. extern int
  394. NSS_CMSAlgArray_GetIndexByAlgID(SECAlgorithmID **algorithmArray, SECAlgorithmID *algid);
  395.  
  396. /*
  397.  * NSS_CMSAlgArray_GetIndexByAlgID - find a specific algorithm in an array of 
  398.  * algorithms.
  399.  *
  400.  * algorithmArray - array of algorithm IDs
  401.  * algiddata - id of algorithm to pick
  402.  *
  403.  * Returns:
  404.  *  An integer containing the index of the algorithm in the array or -1 if 
  405.  *  algorithm was not found.
  406.  */
  407. extern int
  408. NSS_CMSAlgArray_GetIndexByAlgTag(SECAlgorithmID **algorithmArray, SECOidTag algtag);
  409.  
  410. extern const SECHashObject *
  411. NSS_CMSUtil_GetHashObjByAlgID(SECAlgorithmID *algid);
  412.  
  413. /*
  414.  * XXX I would *really* like to not have to do this, but the current
  415.  * signing interface gives me little choice.
  416.  */
  417. extern SECOidTag
  418. NSS_CMSUtil_MakeSignatureAlgorithm(SECOidTag hashalg, SECOidTag encalg);
  419.  
  420. extern const SEC_ASN1Template *
  421. NSS_CMSUtil_GetTemplateByTypeTag(SECOidTag type);
  422.  
  423. extern size_t
  424. NSS_CMSUtil_GetSizeByTypeTag(SECOidTag type);
  425.  
  426. extern NSSCMSContentInfo *
  427. NSS_CMSContent_GetContentInfo(void *msg, SECOidTag type);
  428.  
  429. extern const char *
  430. NSS_CMSUtil_VerificationStatusToString(NSSCMSVerificationStatus vs);
  431.  
  432. /************************************************************************
  433.  * cmssigdata.c - CMS signedData methods
  434.  ************************************************************************/
  435.  
  436. extern NSSCMSSignedData *
  437. NSS_CMSSignedData_Create(NSSCMSMessage *cmsg);
  438.  
  439. extern void
  440. NSS_CMSSignedData_Destroy(NSSCMSSignedData *sigd);
  441.  
  442. /*
  443.  * NSS_CMSSignedData_Encode_BeforeStart - do all the necessary things to a SignedData
  444.  *     before start of encoding.
  445.  *
  446.  * In detail:
  447.  *  - find out about the right value to put into sigd->version
  448.  *  - come up with a list of digestAlgorithms (which should be the union of the algorithms
  449.  *         in the signerinfos).
  450.  *         If we happen to have a pre-set list of algorithms (and digest values!), we
  451.  *         check if we have all the signerinfos' algorithms. If not, this is an error.
  452.  */
  453. extern SECStatus
  454. NSS_CMSSignedData_Encode_BeforeStart(NSSCMSSignedData *sigd);
  455.  
  456. extern SECStatus
  457. NSS_CMSSignedData_Encode_BeforeData(NSSCMSSignedData *sigd);
  458.  
  459. /*
  460.  * NSS_CMSSignedData_Encode_AfterData - do all the necessary things to a SignedData
  461.  *     after all the encapsulated data was passed through the encoder.
  462.  *
  463.  * In detail:
  464.  *  - create the signatures in all the SignerInfos
  465.  *
  466.  * Please note that nothing is done to the Certificates and CRLs in the message - this
  467.  * is entirely the responsibility of our callers.
  468.  */
  469. extern SECStatus
  470. NSS_CMSSignedData_Encode_AfterData(NSSCMSSignedData *sigd);
  471.  
  472. extern SECStatus
  473. NSS_CMSSignedData_Decode_BeforeData(NSSCMSSignedData *sigd);
  474.  
  475. /*
  476.  * NSS_CMSSignedData_Decode_AfterData - do all the necessary things to a SignedData
  477.  *     after all the encapsulated data was passed through the decoder.
  478.  */
  479. extern SECStatus
  480. NSS_CMSSignedData_Decode_AfterData(NSSCMSSignedData *sigd);
  481.  
  482. /*
  483.  * NSS_CMSSignedData_Decode_AfterEnd - do all the necessary things to a SignedData
  484.  *     after all decoding is finished.
  485.  */
  486. extern SECStatus
  487. NSS_CMSSignedData_Decode_AfterEnd(NSSCMSSignedData *sigd);
  488.  
  489. /* 
  490.  * NSS_CMSSignedData_GetSignerInfos - retrieve the SignedData's signer list
  491.  */
  492. extern NSSCMSSignerInfo **
  493. NSS_CMSSignedData_GetSignerInfos(NSSCMSSignedData *sigd);
  494.  
  495. extern int
  496. NSS_CMSSignedData_SignerInfoCount(NSSCMSSignedData *sigd);
  497.  
  498. extern NSSCMSSignerInfo *
  499. NSS_CMSSignedData_GetSignerInfo(NSSCMSSignedData *sigd, int i);
  500.  
  501. /* 
  502.  * NSS_CMSSignedData_GetDigestAlgs - retrieve the SignedData's digest algorithm list
  503.  */
  504. extern SECAlgorithmID **
  505. NSS_CMSSignedData_GetDigestAlgs(NSSCMSSignedData *sigd);
  506.  
  507. /*
  508.  * NSS_CMSSignedData_GetContentInfo - return pointer to this signedData's contentinfo
  509.  */
  510. extern NSSCMSContentInfo *
  511. NSS_CMSSignedData_GetContentInfo(NSSCMSSignedData *sigd);
  512.  
  513. /* 
  514.  * NSS_CMSSignedData_GetCertificateList - retrieve the SignedData's certificate list
  515.  */
  516. extern SECItem **
  517. NSS_CMSSignedData_GetCertificateList(NSSCMSSignedData *sigd);
  518.  
  519. extern SECStatus
  520. NSS_CMSSignedData_ImportCerts(NSSCMSSignedData *sigd, CERTCertDBHandle *certdb,
  521.                 SECCertUsage certusage, PRBool keepcerts);
  522.  
  523. /*
  524.  * NSS_CMSSignedData_HasDigests - see if we have digests in place
  525.  */
  526. extern PRBool
  527. NSS_CMSSignedData_HasDigests(NSSCMSSignedData *sigd);
  528.  
  529. /*
  530.  * NSS_CMSSignedData_VerifySignerInfo - check a signature.
  531.  *
  532.  * The digests were either calculated during decoding (and are stored in the
  533.  * signedData itself) or set after decoding using NSS_CMSSignedData_SetDigests.
  534.  *
  535.  * The verification checks if the signing cert is valid and has a trusted chain
  536.  * for the purpose specified by "certusage".
  537.  */
  538. extern SECStatus
  539. NSS_CMSSignedData_VerifySignerInfo(NSSCMSSignedData *sigd, int i, CERTCertDBHandle *certdb,
  540.                     SECCertUsage certusage);
  541.  
  542. /*
  543.  * NSS_CMSSignedData_VerifyCertsOnly - verify the certs in a certs-only message
  544. */
  545. extern SECStatus
  546. NSS_CMSSignedData_VerifyCertsOnly(NSSCMSSignedData *sigd, 
  547.                                   CERTCertDBHandle *certdb, 
  548.                                   SECCertUsage usage);
  549.  
  550. extern SECStatus
  551. NSS_CMSSignedData_AddCertList(NSSCMSSignedData *sigd, CERTCertificateList *certlist);
  552.  
  553. /*
  554.  * NSS_CMSSignedData_AddCertChain - add cert and its entire chain to the set of certs 
  555.  */
  556. extern SECStatus
  557. NSS_CMSSignedData_AddCertChain(NSSCMSSignedData *sigd, CERTCertificate *cert);
  558.  
  559. extern SECStatus
  560. NSS_CMSSignedData_AddCertificate(NSSCMSSignedData *sigd, CERTCertificate *cert);
  561.  
  562. extern PRBool
  563. NSS_CMSSignedData_ContainsCertsOrCrls(NSSCMSSignedData *sigd);
  564.  
  565. extern SECStatus
  566. NSS_CMSSignedData_AddSignerInfo(NSSCMSSignedData *sigd,
  567.                 NSSCMSSignerInfo *signerinfo);
  568.  
  569. extern SECStatus
  570. NSS_CMSSignedData_SetDigests(NSSCMSSignedData *sigd,
  571.                 SECAlgorithmID **digestalgs,
  572.                 SECItem **digests);
  573.  
  574. extern SECStatus
  575. NSS_CMSSignedData_SetDigestValue(NSSCMSSignedData *sigd,
  576.                 SECOidTag digestalgtag,
  577.                 SECItem *digestdata);
  578.  
  579. extern SECStatus
  580. NSS_CMSSignedData_AddDigest(PRArenaPool *poolp,
  581.                 NSSCMSSignedData *sigd,
  582.                 SECOidTag digestalgtag,
  583.                 SECItem *digest);
  584.  
  585. extern SECItem *
  586. NSS_CMSSignedData_GetDigestValue(NSSCMSSignedData *sigd, SECOidTag digestalgtag);
  587.  
  588. /*
  589.  * NSS_CMSSignedData_CreateCertsOnly - create a certs-only SignedData.
  590.  *
  591.  * cert          - base certificates that will be included
  592.  * include_chain - if true, include the complete cert chain for cert
  593.  *
  594.  * More certs and chains can be added via AddCertificate and AddCertChain.
  595.  *
  596.  * An error results in a return value of NULL and an error set.
  597.  */
  598. extern NSSCMSSignedData *
  599. NSS_CMSSignedData_CreateCertsOnly(NSSCMSMessage *cmsg, CERTCertificate *cert, PRBool include_chain);
  600.  
  601. /************************************************************************
  602.  * cmssiginfo.c - signerinfo methods
  603.  ************************************************************************/
  604.  
  605. extern NSSCMSSignerInfo *
  606. NSS_CMSSignerInfo_Create(NSSCMSMessage *cmsg, CERTCertificate *cert, SECOidTag digestalgtag);
  607. extern NSSCMSSignerInfo *
  608. NSS_CMSSignerInfo_CreateWithSubjKeyID(NSSCMSMessage *cmsg, SECItem *subjKeyID, SECKEYPublicKey *pubKey, SECKEYPrivateKey *signingKey, SECOidTag digestalgtag);
  609.  
  610. /*
  611.  * NSS_CMSSignerInfo_Destroy - destroy a SignerInfo data structure
  612.  */
  613. extern void
  614. NSS_CMSSignerInfo_Destroy(NSSCMSSignerInfo *si);
  615.  
  616. /*
  617.  * NSS_CMSSignerInfo_Sign - sign something
  618.  *
  619.  */
  620. extern SECStatus
  621. NSS_CMSSignerInfo_Sign(NSSCMSSignerInfo *signerinfo, SECItem *digest, SECItem *contentType);
  622.  
  623. extern SECStatus
  624. NSS_CMSSignerInfo_VerifyCertificate(NSSCMSSignerInfo *signerinfo, CERTCertDBHandle *certdb,
  625.                 SECCertUsage certusage);
  626.  
  627. /*
  628.  * NSS_CMSSignerInfo_Verify - verify the signature of a single SignerInfo
  629.  *
  630.  * Just verifies the signature. The assumption is that verification of the certificate
  631.  * is done already.
  632.  */
  633. extern SECStatus
  634. NSS_CMSSignerInfo_Verify(NSSCMSSignerInfo *signerinfo, SECItem *digest, SECItem *contentType);
  635.  
  636. extern NSSCMSVerificationStatus
  637. NSS_CMSSignerInfo_GetVerificationStatus(NSSCMSSignerInfo *signerinfo);
  638.  
  639. extern SECOidData *
  640. NSS_CMSSignerInfo_GetDigestAlg(NSSCMSSignerInfo *signerinfo);
  641.  
  642. extern SECOidTag
  643. NSS_CMSSignerInfo_GetDigestAlgTag(NSSCMSSignerInfo *signerinfo);
  644.  
  645. extern int
  646. NSS_CMSSignerInfo_GetVersion(NSSCMSSignerInfo *signerinfo);
  647.  
  648. extern CERTCertificateList *
  649. NSS_CMSSignerInfo_GetCertList(NSSCMSSignerInfo *signerinfo);
  650.  
  651. /*
  652.  * NSS_CMSSignerInfo_GetSigningTime - return the signing time,
  653.  *                      in UTCTime format, of a CMS signerInfo.
  654.  *
  655.  * sinfo - signerInfo data for this signer
  656.  *
  657.  * Returns a pointer to XXXX (what?)
  658.  * A return value of NULL is an error.
  659.  */
  660. extern SECStatus
  661. NSS_CMSSignerInfo_GetSigningTime(NSSCMSSignerInfo *sinfo, PRTime *stime);
  662.  
  663. /*
  664.  * Return the signing cert of a CMS signerInfo.
  665.  *
  666.  * the certs in the enclosing SignedData must have been imported already
  667.  */
  668. extern CERTCertificate *
  669. NSS_CMSSignerInfo_GetSigningCertificate(NSSCMSSignerInfo *signerinfo, CERTCertDBHandle *certdb);
  670.  
  671. /*
  672.  * NSS_CMSSignerInfo_GetSignerCommonName - return the common name of the signer
  673.  *
  674.  * sinfo - signerInfo data for this signer
  675.  *
  676.  * Returns a pointer to allocated memory, which must be freed with PORT_Free.
  677.  * A return value of NULL is an error.
  678.  */
  679. extern char *
  680. NSS_CMSSignerInfo_GetSignerCommonName(NSSCMSSignerInfo *sinfo);
  681.  
  682. /*
  683.  * NSS_CMSSignerInfo_GetSignerEmailAddress - return the common name of the signer
  684.  *
  685.  * sinfo - signerInfo data for this signer
  686.  *
  687.  * Returns a pointer to allocated memory, which must be freed.
  688.  * A return value of NULL is an error.
  689.  */
  690. extern char *
  691. NSS_CMSSignerInfo_GetSignerEmailAddress(NSSCMSSignerInfo *sinfo);
  692.  
  693. /*
  694.  * NSS_CMSSignerInfo_AddAuthAttr - add an attribute to the
  695.  * authenticated (i.e. signed) attributes of "signerinfo". 
  696.  */
  697. extern SECStatus
  698. NSS_CMSSignerInfo_AddAuthAttr(NSSCMSSignerInfo *signerinfo, NSSCMSAttribute *attr);
  699.  
  700. /*
  701.  * NSS_CMSSignerInfo_AddUnauthAttr - add an attribute to the
  702.  * unauthenticated attributes of "signerinfo". 
  703.  */
  704. extern SECStatus
  705. NSS_CMSSignerInfo_AddUnauthAttr(NSSCMSSignerInfo *signerinfo, NSSCMSAttribute *attr);
  706.  
  707. /* 
  708.  * NSS_CMSSignerInfo_AddSigningTime - add the signing time to the
  709.  * authenticated (i.e. signed) attributes of "signerinfo". 
  710.  *
  711.  * This is expected to be included in outgoing signed
  712.  * messages for email (S/MIME) but is likely useful in other situations.
  713.  *
  714.  * This should only be added once; a second call will do nothing.
  715.  *
  716.  * XXX This will probably just shove the current time into "signerinfo"
  717.  * but it will not actually get signed until the entire item is
  718.  * processed for encoding.  Is this (expected to be small) delay okay?
  719.  */
  720. extern SECStatus
  721. NSS_CMSSignerInfo_AddSigningTime(NSSCMSSignerInfo *signerinfo, PRTime t);
  722.  
  723. /*
  724.  * NSS_CMSSignerInfo_AddSMIMECaps - add a SMIMECapabilities attribute to the
  725.  * authenticated (i.e. signed) attributes of "signerinfo".
  726.  *
  727.  * This is expected to be included in outgoing signed
  728.  * messages for email (S/MIME).
  729.  */
  730. extern SECStatus
  731. NSS_CMSSignerInfo_AddSMIMECaps(NSSCMSSignerInfo *signerinfo);
  732.  
  733. /*
  734.  * NSS_CMSSignerInfo_AddSMIMEEncKeyPrefs - add a SMIMEEncryptionKeyPreferences attribute to the
  735.  * authenticated (i.e. signed) attributes of "signerinfo".
  736.  *
  737.  * This is expected to be included in outgoing signed messages for email (S/MIME).
  738.  */
  739. SECStatus
  740. NSS_CMSSignerInfo_AddSMIMEEncKeyPrefs(NSSCMSSignerInfo *signerinfo, CERTCertificate *cert, CERTCertDBHandle *certdb);
  741.  
  742. /*
  743.  * NSS_CMSSignerInfo_AddMSSMIMEEncKeyPrefs - add a SMIMEEncryptionKeyPreferences attribute to the
  744.  * authenticated (i.e. signed) attributes of "signerinfo", using the OID prefered by Microsoft.
  745.  *
  746.  * This is expected to be included in outgoing signed messages for email (S/MIME),
  747.  * if compatibility with Microsoft mail clients is wanted.
  748.  */
  749. SECStatus
  750. NSS_CMSSignerInfo_AddMSSMIMEEncKeyPrefs(NSSCMSSignerInfo *signerinfo, CERTCertificate *cert, CERTCertDBHandle *certdb);
  751.  
  752. /* 
  753.  * NSS_CMSSignerInfo_AddCounterSignature - countersign a signerinfo
  754.  */
  755. extern SECStatus
  756. NSS_CMSSignerInfo_AddCounterSignature(NSSCMSSignerInfo *signerinfo,
  757.                     SECOidTag digestalg, CERTCertificate signingcert);
  758.  
  759. /*
  760.  * XXXX the following needs to be done in the S/MIME layer code
  761.  * after signature of a signerinfo is verified
  762.  */
  763. extern SECStatus
  764. NSS_SMIMESignerInfo_SaveSMIMEProfile(NSSCMSSignerInfo *signerinfo);
  765.  
  766. /*
  767.  * NSS_CMSSignerInfo_IncludeCerts - set cert chain inclusion mode for this signer
  768.  */
  769. extern SECStatus
  770. NSS_CMSSignerInfo_IncludeCerts(NSSCMSSignerInfo *signerinfo, NSSCMSCertChainMode cm, SECCertUsage usage);
  771.  
  772. /************************************************************************
  773.  * cmsenvdata.c - CMS envelopedData methods
  774.  ************************************************************************/
  775.  
  776. /*
  777.  * NSS_CMSEnvelopedData_Create - create an enveloped data message
  778.  */
  779. extern NSSCMSEnvelopedData *
  780. NSS_CMSEnvelopedData_Create(NSSCMSMessage *cmsg, SECOidTag algorithm, int keysize);
  781.  
  782. /*
  783.  * NSS_CMSEnvelopedData_Destroy - destroy an enveloped data message
  784.  */
  785. extern void
  786. NSS_CMSEnvelopedData_Destroy(NSSCMSEnvelopedData *edp);
  787.  
  788. /*
  789.  * NSS_CMSEnvelopedData_GetContentInfo - return pointer to this envelopedData's contentinfo
  790.  */
  791. extern NSSCMSContentInfo *
  792. NSS_CMSEnvelopedData_GetContentInfo(NSSCMSEnvelopedData *envd);
  793.  
  794. /*
  795.  * NSS_CMSEnvelopedData_AddRecipient - add a recipientinfo to the enveloped data msg
  796.  *
  797.  * rip must be created on the same pool as edp - this is not enforced, though.
  798.  */
  799. extern SECStatus
  800. NSS_CMSEnvelopedData_AddRecipient(NSSCMSEnvelopedData *edp, NSSCMSRecipientInfo *rip);
  801.  
  802. /*
  803.  * NSS_CMSEnvelopedData_Encode_BeforeStart - prepare this envelopedData for encoding
  804.  *
  805.  * at this point, we need
  806.  * - recipientinfos set up with recipient's certificates
  807.  * - a content encryption algorithm (if none, 3DES will be used)
  808.  *
  809.  * this function will generate a random content encryption key (aka bulk key),
  810.  * initialize the recipientinfos with certificate identification and wrap the bulk key
  811.  * using the proper algorithm for every certificiate.
  812.  * it will finally set the bulk algorithm and key so that the encode step can find it.
  813.  */
  814. extern SECStatus
  815. NSS_CMSEnvelopedData_Encode_BeforeStart(NSSCMSEnvelopedData *envd);
  816.  
  817. /*
  818.  * NSS_CMSEnvelopedData_Encode_BeforeData - set up encryption
  819.  */
  820. extern SECStatus
  821. NSS_CMSEnvelopedData_Encode_BeforeData(NSSCMSEnvelopedData *envd);
  822.  
  823. /*
  824.  * NSS_CMSEnvelopedData_Encode_AfterData - finalize this envelopedData for encoding
  825.  */
  826. extern SECStatus
  827. NSS_CMSEnvelopedData_Encode_AfterData(NSSCMSEnvelopedData *envd);
  828.  
  829. /*
  830.  * NSS_CMSEnvelopedData_Decode_BeforeData - find our recipientinfo, 
  831.  * derive bulk key & set up our contentinfo
  832.  */
  833. extern SECStatus
  834. NSS_CMSEnvelopedData_Decode_BeforeData(NSSCMSEnvelopedData *envd);
  835.  
  836. /*
  837.  * NSS_CMSEnvelopedData_Decode_AfterData - finish decrypting this envelopedData's content
  838.  */
  839. extern SECStatus
  840. NSS_CMSEnvelopedData_Decode_AfterData(NSSCMSEnvelopedData *envd);
  841.  
  842. /*
  843.  * NSS_CMSEnvelopedData_Decode_AfterEnd - finish decoding this envelopedData
  844.  */
  845. extern SECStatus
  846. NSS_CMSEnvelopedData_Decode_AfterEnd(NSSCMSEnvelopedData *envd);
  847.  
  848.  
  849. /************************************************************************
  850.  * cmsrecinfo.c - CMS recipientInfo methods
  851.  ************************************************************************/
  852.  
  853. /*
  854.  * NSS_CMSRecipientInfo_Create - create a recipientinfo
  855.  *
  856.  * we currently do not create KeyAgreement recipientinfos with multiple recipientEncryptedKeys
  857.  * the certificate is supposed to have been verified by the caller
  858.  */
  859. extern NSSCMSRecipientInfo *
  860. NSS_CMSRecipientInfo_Create(NSSCMSMessage *cmsg, CERTCertificate *cert);
  861.  
  862. extern NSSCMSRecipientInfo *
  863. NSS_CMSRecipientInfo_CreateWithSubjKeyID(NSSCMSMessage   *cmsg, 
  864.                                          SECItem         *subjKeyID,
  865.                                          SECKEYPublicKey *pubKey);
  866.  
  867. extern NSSCMSRecipientInfo *
  868. NSS_CMSRecipientInfo_CreateWithSubjKeyIDFromCert(NSSCMSMessage *cmsg, 
  869.                                                  CERTCertificate *cert);
  870.  
  871. /*
  872.  * NSS_CMSRecipientInfo_CreateNew - create a blank recipientinfo for 
  873.  * applications which want to encode their own CMS structures and
  874.  * key exchange types.
  875.  */
  876. extern NSSCMSRecipientInfo *
  877. NSS_CMSRecipientInfo_CreateNew(void* pwfn_arg);
  878.  
  879. /*
  880.  * NSS_CMSRecipientInfo_CreateFromDER - create a recipientinfo  from partially
  881.  * decoded DER data for applications which want to encode their own CMS 
  882.  * structures and key exchange types.
  883.  */
  884. extern NSSCMSRecipientInfo *
  885. NSS_CMSRecipientInfo_CreateFromDER(SECItem* input, void* pwfn_arg);
  886.  
  887. extern void
  888. NSS_CMSRecipientInfo_Destroy(NSSCMSRecipientInfo *ri);
  889.  
  890. /*
  891.  * NSS_CMSRecipientInfo_GetCertAndKey - retrieve the cert and key from the
  892.  * recipientInfo struct. If retcert or retkey are NULL, the cert or 
  893.  * key (respectively) would not be returned). This function is a no-op if both 
  894.  * retcert and retkey are NULL. Caller inherits ownership of the cert and key
  895.  * he requested (and is responsible to free them).
  896.  */
  897. SECStatus NSS_CMSRecipientInfo_GetCertAndKey(NSSCMSRecipientInfo *ri,
  898.    CERTCertificate** retcert, SECKEYPrivateKey** retkey);
  899.  
  900. extern int
  901. NSS_CMSRecipientInfo_GetVersion(NSSCMSRecipientInfo *ri);
  902.  
  903. extern SECItem *
  904. NSS_CMSRecipientInfo_GetEncryptedKey(NSSCMSRecipientInfo *ri, int subIndex);
  905.  
  906. /*
  907.  * NSS_CMSRecipientInfo_Encode - encode an NSS_CMSRecipientInfo as ASN.1
  908.  */
  909. SECStatus NSS_CMSRecipientInfo_Encode(PRArenaPool* poolp,
  910.                                       const NSSCMSRecipientInfo *src,
  911.                                       SECItem* returned);
  912.  
  913. extern SECOidTag
  914. NSS_CMSRecipientInfo_GetKeyEncryptionAlgorithmTag(NSSCMSRecipientInfo *ri);
  915.  
  916. extern SECStatus
  917. NSS_CMSRecipientInfo_WrapBulkKey(NSSCMSRecipientInfo *ri, PK11SymKey *bulkkey, SECOidTag bulkalgtag);
  918.  
  919. extern PK11SymKey *
  920. NSS_CMSRecipientInfo_UnwrapBulkKey(NSSCMSRecipientInfo *ri, int subIndex,
  921.         CERTCertificate *cert, SECKEYPrivateKey *privkey, SECOidTag bulkalgtag);
  922.  
  923. /************************************************************************
  924.  * cmsencdata.c - CMS encryptedData methods
  925.  ************************************************************************/
  926. /*
  927.  * NSS_CMSEncryptedData_Create - create an empty encryptedData object.
  928.  *
  929.  * "algorithm" specifies the bulk encryption algorithm to use.
  930.  * "keysize" is the key size.
  931.  * 
  932.  * An error results in a return value of NULL and an error set.
  933.  * (Retrieve specific errors via PORT_GetError()/XP_GetError().)
  934.  */
  935. extern NSSCMSEncryptedData *
  936. NSS_CMSEncryptedData_Create(NSSCMSMessage *cmsg, SECOidTag algorithm, int keysize);
  937.  
  938. /*
  939.  * NSS_CMSEncryptedData_Destroy - destroy an encryptedData object
  940.  */
  941. extern void
  942. NSS_CMSEncryptedData_Destroy(NSSCMSEncryptedData *encd);
  943.  
  944. /*
  945.  * NSS_CMSEncryptedData_GetContentInfo - return pointer to encryptedData object's contentInfo
  946.  */
  947. extern NSSCMSContentInfo *
  948. NSS_CMSEncryptedData_GetContentInfo(NSSCMSEncryptedData *encd);
  949.  
  950. /*
  951.  * NSS_CMSEncryptedData_Encode_BeforeStart - do all the necessary things to a EncryptedData
  952.  *     before encoding begins.
  953.  *
  954.  * In particular:
  955.  *  - set the correct version value.
  956.  *  - get the encryption key
  957.  */
  958. extern SECStatus
  959. NSS_CMSEncryptedData_Encode_BeforeStart(NSSCMSEncryptedData *encd);
  960.  
  961. /*
  962.  * NSS_CMSEncryptedData_Encode_BeforeData - set up encryption
  963.  */
  964. extern SECStatus
  965. NSS_CMSEncryptedData_Encode_BeforeData(NSSCMSEncryptedData *encd);
  966.  
  967. /*
  968.  * NSS_CMSEncryptedData_Encode_AfterData - finalize this encryptedData for encoding
  969.  */
  970. extern SECStatus
  971. NSS_CMSEncryptedData_Encode_AfterData(NSSCMSEncryptedData *encd);
  972.  
  973. /*
  974.  * NSS_CMSEncryptedData_Decode_BeforeData - find bulk key & set up decryption
  975.  */
  976. extern SECStatus
  977. NSS_CMSEncryptedData_Decode_BeforeData(NSSCMSEncryptedData *encd);
  978.  
  979. /*
  980.  * NSS_CMSEncryptedData_Decode_AfterData - finish decrypting this encryptedData's content
  981.  */
  982. extern SECStatus
  983. NSS_CMSEncryptedData_Decode_AfterData(NSSCMSEncryptedData *encd);
  984.  
  985. /*
  986.  * NSS_CMSEncryptedData_Decode_AfterEnd - finish decoding this encryptedData
  987.  */
  988. extern SECStatus
  989. NSS_CMSEncryptedData_Decode_AfterEnd(NSSCMSEncryptedData *encd);
  990.  
  991. /************************************************************************
  992.  * cmsdigdata.c - CMS encryptedData methods
  993.  ************************************************************************/
  994. /*
  995.  * NSS_CMSDigestedData_Create - create a digestedData object (presumably for encoding)
  996.  *
  997.  * version will be set by NSS_CMSDigestedData_Encode_BeforeStart
  998.  * digestAlg is passed as parameter
  999.  * contentInfo must be filled by the user
  1000.  * digest will be calculated while encoding
  1001.  */
  1002. extern NSSCMSDigestedData *
  1003. NSS_CMSDigestedData_Create(NSSCMSMessage *cmsg, SECAlgorithmID *digestalg);
  1004.  
  1005. /*
  1006.  * NSS_CMSDigestedData_Destroy - destroy a digestedData object
  1007.  */
  1008. extern void
  1009. NSS_CMSDigestedData_Destroy(NSSCMSDigestedData *digd);
  1010.  
  1011. /*
  1012.  * NSS_CMSDigestedData_GetContentInfo - return pointer to digestedData object's contentInfo
  1013.  */
  1014. extern NSSCMSContentInfo *
  1015. NSS_CMSDigestedData_GetContentInfo(NSSCMSDigestedData *digd);
  1016.  
  1017. /*
  1018.  * NSS_CMSDigestedData_Encode_BeforeStart - do all the necessary things to a DigestedData
  1019.  *     before encoding begins.
  1020.  *
  1021.  * In particular:
  1022.  *  - set the right version number. The contentInfo's content type must be set up already.
  1023.  */
  1024. extern SECStatus
  1025. NSS_CMSDigestedData_Encode_BeforeStart(NSSCMSDigestedData *digd);
  1026.  
  1027. /*
  1028.  * NSS_CMSDigestedData_Encode_BeforeData - do all the necessary things to a DigestedData
  1029.  *     before the encapsulated data is passed through the encoder.
  1030.  *
  1031.  * In detail:
  1032.  *  - set up the digests if necessary
  1033.  */
  1034. extern SECStatus
  1035. NSS_CMSDigestedData_Encode_BeforeData(NSSCMSDigestedData *digd);
  1036.  
  1037. /*
  1038.  * NSS_CMSDigestedData_Encode_AfterData - do all the necessary things to a DigestedData
  1039.  *     after all the encapsulated data was passed through the encoder.
  1040.  *
  1041.  * In detail:
  1042.  *  - finish the digests
  1043.  */
  1044. extern SECStatus
  1045. NSS_CMSDigestedData_Encode_AfterData(NSSCMSDigestedData *digd);
  1046.  
  1047. /*
  1048.  * NSS_CMSDigestedData_Decode_BeforeData - do all the necessary things to a DigestedData
  1049.  *     before the encapsulated data is passed through the encoder.
  1050.  *
  1051.  * In detail:
  1052.  *  - set up the digests if necessary
  1053.  */
  1054. extern SECStatus
  1055. NSS_CMSDigestedData_Decode_BeforeData(NSSCMSDigestedData *digd);
  1056.  
  1057. /*
  1058.  * NSS_CMSDigestedData_Decode_AfterData - do all the necessary things to a DigestedData
  1059.  *     after all the encapsulated data was passed through the encoder.
  1060.  *
  1061.  * In detail:
  1062.  *  - finish the digests
  1063.  */
  1064. extern SECStatus
  1065. NSS_CMSDigestedData_Decode_AfterData(NSSCMSDigestedData *digd);
  1066.  
  1067. /*
  1068.  * NSS_CMSDigestedData_Decode_AfterEnd - finalize a digestedData.
  1069.  *
  1070.  * In detail:
  1071.  *  - check the digests for equality
  1072.  */
  1073. extern SECStatus
  1074. NSS_CMSDigestedData_Decode_AfterEnd(NSSCMSDigestedData *digd);
  1075.  
  1076. /************************************************************************
  1077.  * cmsdigest.c - digestion routines
  1078.  ************************************************************************/
  1079.  
  1080. /*
  1081.  * NSS_CMSDigestContext_StartMultiple - start digest calculation using all the
  1082.  *  digest algorithms in "digestalgs" in parallel.
  1083.  */
  1084. extern NSSCMSDigestContext *
  1085. NSS_CMSDigestContext_StartMultiple(SECAlgorithmID **digestalgs);
  1086.  
  1087. /*
  1088.  * NSS_CMSDigestContext_StartSingle - same as NSS_CMSDigestContext_StartMultiple, but
  1089.  *  only one algorithm.
  1090.  */
  1091. extern NSSCMSDigestContext *
  1092. NSS_CMSDigestContext_StartSingle(SECAlgorithmID *digestalg);
  1093.  
  1094. /*
  1095.  * NSS_CMSDigestContext_Update - feed more data into the digest machine
  1096.  */
  1097. extern void
  1098. NSS_CMSDigestContext_Update(NSSCMSDigestContext *cmsdigcx, const unsigned char *data, int len);
  1099.  
  1100. /*
  1101.  * NSS_CMSDigestContext_Cancel - cancel digesting operation
  1102.  */
  1103. extern void
  1104. NSS_CMSDigestContext_Cancel(NSSCMSDigestContext *cmsdigcx);
  1105.  
  1106. /*
  1107.  * NSS_CMSDigestContext_FinishMultiple - finish the digests and put them
  1108.  *  into an array of SECItems (allocated on poolp)
  1109.  */
  1110. extern SECStatus
  1111. NSS_CMSDigestContext_FinishMultiple(NSSCMSDigestContext *cmsdigcx, PLArenaPool *poolp,
  1112.                 SECItem ***digestsp);
  1113.  
  1114. /*
  1115.  * NSS_CMSDigestContext_FinishSingle - same as NSS_CMSDigestContext_FinishMultiple,
  1116.  *  but for one digest.
  1117.  */
  1118. extern SECStatus
  1119. NSS_CMSDigestContext_FinishSingle(NSSCMSDigestContext *cmsdigcx, PLArenaPool *poolp,
  1120.                 SECItem *digest);
  1121.  
  1122. /************************************************************************
  1123.  * 
  1124.  ************************************************************************/
  1125.  
  1126. /* shortcuts for basic use */
  1127.  
  1128. /*
  1129.  * NSS_CMSDEREncode - DER Encode a CMS message, with input being
  1130.  *                    the plaintext message and derOut being the output,
  1131.  *                    stored in arena's pool.
  1132.  */
  1133. extern SECStatus
  1134. NSS_CMSDEREncode(NSSCMSMessage *cmsg, SECItem *input, SECItem *derOut, 
  1135.                  PLArenaPool *arena);
  1136.  
  1137.  
  1138. /************************************************************************/
  1139. SEC_END_PROTOS
  1140.  
  1141. #endif /* _CMS_H_ */
  1142.